]>
Commit | Line | Data |
---|---|---|
427c49bc A |
1 | // |
2 | // KNPersistantState.m | |
3 | // Security | |
4 | // | |
5 | // Created by J Osborne on 7/28/13. | |
6 | // | |
7 | // | |
8 | ||
9 | #import "KNPersistantState.h" | |
10 | ||
11 | @implementation KNPersistantState | |
12 | ||
13 | -(NSURL*)urlForStorage | |
14 | { | |
15 | return [NSURL URLWithString:@"Preferences/com.apple.security.KCN.plist" relativeToURL:[[NSFileManager defaultManager] URLForDirectory:NSLibraryDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil]]; | |
16 | } | |
17 | ||
18 | +(instancetype)loadFromStorage | |
19 | { | |
20 | KNPersistantState *state = [[KNPersistantState alloc] init]; | |
21 | if (!state) { | |
22 | return state; | |
23 | } | |
24 | ||
25 | id plist = @{@"lastWritten": [NSDate distantPast]}; | |
26 | ||
27 | NSError *error = nil; | |
28 | NSData *stateData = [NSData dataWithContentsOfURL:[state urlForStorage] options:0 error:&error]; | |
29 | if (!stateData) { | |
30 | NSLog(@"Can't read state data (p=%@, err=%@)", [state urlForStorage], error); | |
31 | } else { | |
32 | NSPropertyListFormat format; | |
33 | plist = [NSPropertyListSerialization propertyListWithData:stateData options: NSPropertyListMutableContainersAndLeaves format:&format error:&error]; | |
34 | ||
35 | if (plist == nil) { | |
36 | NSLog(@"Can't deserialize %@, e=%@", stateData, error); | |
37 | } | |
38 | } | |
39 | ||
40 | state.lastCircleStatus = plist[@"lastCircleStatus"] ? [plist[@"lastCircleStatus"] intValue] : kSOSCCCircleAbsent; | |
41 | state.lastWritten = plist[@"lastWritten"]; | |
42 | state.pendingApplicationReminderInterval = plist[@"pendingApplicationReminderInterval"]; | |
43 | state.debugLeftReason = plist[@"debugLeftReason"]; | |
44 | state.pendingApplicationReminder = plist[@"pendingApplicationReminder"]; | |
45 | state.applcationDate = plist[@"applcationDate"]; | |
46 | if (!state.applcationDate) { | |
47 | state.applcationDate = [NSDate distantPast]; | |
48 | } | |
49 | if (!state.pendingApplicationReminder) { | |
50 | state.pendingApplicationReminder = [NSDate distantFuture]; | |
51 | } | |
52 | if (!state.pendingApplicationReminderInterval || [state.pendingApplicationReminderInterval doubleValue] <= 0) { | |
53 | state.pendingApplicationReminderInterval = [NSNumber numberWithUnsignedInt:60 * 60 * 24 * 2]; | |
54 | } | |
55 | ||
56 | return state; | |
57 | } | |
58 | ||
59 | -(void)writeToStorage | |
60 | { | |
61 | NSMutableDictionary *plist = [@{@"lastCircleStatus": [NSNumber numberWithInt:self.lastCircleStatus], | |
62 | @"lastWritten": [NSDate date], | |
63 | @"applcationDate": self.applcationDate, | |
64 | @"pendingApplicationReminder": self.pendingApplicationReminder, | |
65 | } mutableCopy]; | |
66 | if (self.debugLeftReason) { | |
67 | plist[@"debugLeftReason"] = self.debugLeftReason; | |
68 | } | |
69 | if (self.pendingApplicationReminderInterval) { | |
70 | plist[@"pendingApplicationReminderInterval"] = self.pendingApplicationReminderInterval; | |
71 | } | |
72 | NSLog(@"writeToStorage plist=%@", plist); | |
73 | ||
74 | NSError *error = nil; | |
75 | NSData *stateData = [NSPropertyListSerialization dataWithPropertyList:[plist copy] format:NSPropertyListXMLFormat_v1_0 options:kCFPropertyListImmutable error:&error]; | |
76 | if (!stateData) { | |
77 | NSLog(@"Can't serialize %@: %@", plist, error); | |
78 | return; | |
79 | } | |
80 | if (![stateData writeToURL:[self urlForStorage] options:NSDataWritingAtomic error:&error]) { | |
81 | NSLog(@"Can't write to %@, error=%@", [self urlForStorage], error); | |
82 | } | |
83 | } | |
84 | ||
85 | ||
86 | @end |